package com.example.demo.config.shiro;

import com.example.demo.service.LoginService;
import com.example.demo.utils.ShiroUtils;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 配置shiro
 */
@Configuration
public class ShiroConfig {

    @Autowired
    LoginService loginService;

    // 1. 创建 ShiroFilter
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getshiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){

        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        // 设置 安全管理器
        System.out.println("=======ShiroFilterFactoryBean======");
        bean.setSecurityManager(defaultWebSecurityManager);

        // 设置文件资源
        Map<String ,String> map=new HashMap<>();
        // 开放了 login ,和 register 页面
        map.put("/login","anon");// 开放首页
        map.put("/register","anon");
        map.put("/person/login","anon");
        map.put("/person/register","anon");
        // 拦截了 /findAll 这个请求 ,这个资源需要 授权加上认证。所以访问不了
        map.put("/person/findAll","authc");
        // 剩下的两个 路由，因为添加了 注解，所以这里不需要添加 ，也是有用的
        bean.setFilterChainDefinitionMap(map);

        bean.setUnauthorizedUrl("quanxian");
        // 如果文件资源没有权限，跳转到那个页面
        bean.setLoginUrl("login");

        return bean;
    }

    /**
     * 2. 创建 web 类型的 安全管理器
     * @param realm
     * @return
     */
    @Bean
    DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("getRealm") Realm realm){
        DefaultWebSecurityManager manager=new DefaultWebSecurityManager();
        manager.setRealm(realm);
        return manager;
    }

    /**
     * 自定义一个 Realm 管理器
     * @return
     */
    @Bean("getRealm")
    public Realm realm(){
        // 设置算法的密度
        HashedCredentialsMatcher hashedCredentialsMatcher=new HashedCredentialsMatcher();
        //设置Md5 加密
        hashedCredentialsMatcher.setHashAlgorithmName(ShiroUtils.hashAlgorithmName);
        // 设置hash 散列度
        hashedCredentialsMatcher.setHashIterations(ShiroUtils.hashIterations);
        ShiroRealm realm=new ShiroRealm();
        realm.setCredentialsMatcher(hashedCredentialsMatcher);

        realm.setCacheManager(new ShiroCacheManager());
        realm.setCachingEnabled(true);// 开启全局缓存
        realm.setAuthenticationCachingEnabled(true);
        realm.setAuthenticationCacheName("renZhenCache");
        realm.setAuthorizationCachingEnabled(true);
        realm.setAuthorizationCacheName("shouQuanCache");


        return realm;
    }
}
